# 设置 CMake 的最低版本要求为 3.16，低于此版本的 CMake 将无法处理此项目
cmake_minimum_required(VERSION 3.16)

# 定义项目名称为 qttouch，版本为 0.1，使用的语言为 C++
project(qttouch VERSION 0.1 LANGUAGES CXX)

# 开启自动生成 UI 代码的功能，适用于 Qt 的.ui 文件
set(CMAKE_AUTOUIC ON)
# 开启自动生成元对象代码的功能，用于 Qt 的信号槽机制等
set(CMAKE_AUTOMOC ON)
# 开启自动处理资源文件的功能，适用于 Qt 的.qrc 资源文件
set(CMAKE_AUTORCC ON)

# 设置 C++ 标准为 C++17
set(CMAKE_CXX_STANDARD 17)
# 要求项目必须使用指定的 C++ 标准，不允许降级
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 查找 Qt 库，优先查找 Qt6，如果未找到则查找 Qt5，要求包含 Widgets 组件
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
# 根据找到的 Qt 版本，再次查找 Qt 库并获取相应版本的 Widgets 组件
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

# 定义项目的源文件列表，这里包含了 main.cpp、mainwindow.cpp、mainwindow.h 和 mainwindow.ui
set(PROJECT_SOURCES
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
)

# 根据找到的 Qt 版本的主版本号进行判断
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    # 如果是 Qt 6 及以上版本，使用 qt_add_executable 来创建一个可执行文件目标 qttouch，并开启手动完成配置
    qt_add_executable(qttouch
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
else()
    # 如果不是 Qt 6 及以上版本，进一步判断是否为 Android 平台
    if(ANDROID)
        # 如果是 Android 平台，创建一个共享库目标 qttouch
        add_library(qttouch SHARED
            ${PROJECT_SOURCES}
        )
    else()
        # 如果不是 Android 平台，创建一个可执行文件目标 qttouch
        add_executable(qttouch
            ${PROJECT_SOURCES}
        )
    endif()
endif()

# 为目标 qttouch 设置公共的包含目录，这里添加了 OpenHaptics 库的头文件目录以及项目自身的头文件目录
target_include_directories(qttouch PUBLIC
    ${PROJECT_SOURCE_DIR}/includes
)

# 为目标 qttouch 设置公共的链接目录，这里指定了 OpenHaptics 库的库文件所在目录（Win32 Debug 版本）
target_link_directories(qttouch PUBLIC
    ${PROJECT_SOURCE_DIR}/libs/lib1/Win32/Debug
    ${PROJECT_SOURCE_DIR}/libs/lib2/Win32/Debug
)

# 为目标 qttouch 链接私有库，包括 Qt 的 Widgets 组件库以及 OpenHaptics 相关的库
target_link_libraries(qttouch PRIVATE
    Qt${QT_VERSION_MAJOR}::Widgets
    hd hdu hl SnapConstraints
)

# 如果 Qt 版本低于 6.1.0，设置 macOS 应用程序包的标识符（bundle identifier）
if(${QT_VERSION} VERSION_LESS 6.1.0)
    set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.qttouch)
endif()
# 设置目标 qttouch 的属性，包括应用程序包的标识符、版本号等信息，适用于 macOS 和 Windows 平台
set_target_properties(qttouch PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

# 包含 GNU 安装目录相关的模块，用于定义标准的安装目录
include(GNUInstallDirs)

# 定义目标 qttouch 的安装规则，将可执行文件、库等安装到当前构建目录（CMAKE_CURRENT_BINARY_DIR）
install(TARGETS qttouch
    BUNDLE DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
    LIBRARY DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
    RUNTIME DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
)

# 如果 Qt 版本的主版本号为 6，完成可执行文件 qttouch 的最终配置
if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(qttouch)
endif()
